private Prepared parsePrepared() { int start = lastParseIndex; Prepared c = null; String token = currentToken; if (token.length() == 0) { c = new NoOperation(session); } else { char first = token.charAt(0); switch (first) { case '?': // read the ? as a parameter readTerm(); // this is an 'out' parameter - set a dummy value parameters.get(0).setValue(ValueNull.INSTANCE); read("="); read("CALL"); c = parseCall(); break; case '(': c = parseSelect(); break; case 'a': case 'A': if (readIf("ALTER")) { c = parseAlter(); } else if (readIf("ANALYZE")) { c = parseAnalyze(); } break; case 'b': case 'B': if (readIf("BACKUP")) { c = parseBackup(); } else if (readIf("BEGIN")) { c = parseBegin(); } break; case 'c': case 'C': if (readIf("COMMIT")) { c = parseCommit(); } else if (readIf("CREATE")) { c = parseCreate(); } else if (readIf("CALL")) { c = parseCall(); } else if (readIf("CHECKPOINT")) { c = parseCheckpoint(); } else if (readIf("COMMENT")) { c = parseComment(); } break; case 'd': case 'D': if (readIf("DELETE")) { c = parseDelete(); } else if (readIf("DROP")) { c = parseDrop(); } else if (readIf("DECLARE")) { // support for DECLARE GLOBAL TEMPORARY TABLE... c = parseCreate(); } else if (readIf("DEALLOCATE")) { c = parseDeallocate(); } break; case 'e': case 'E': if (readIf("EXPLAIN")) { c = parseExplain(); } else if (readIf("EXECUTE")) { c = parseExecute(); } break; case 'f': case 'F': if (isToken("FROM")) { c = parseSelect(); } break; case 'g': case 'G': if (readIf("GRANT")) { c = parseGrantRevoke(CommandInterface.GRANT); } break; case 'h': case 'H': if (readIf("HELP")) { c = parseHelp(); } break; case 'i': case 'I': if (readIf("INSERT")) { c = parseInsert(); } break; case 'm': case 'M': if (readIf("MERGE")) { c = parseMerge(); } break; case 'p': case 'P': if (readIf("PREPARE")) { c = parsePrepare(); } break; case 'r': case 'R': if (readIf("ROLLBACK")) { c = parseRollback(); } else if (readIf("REVOKE")) { c = parseGrantRevoke(CommandInterface.REVOKE); } else if (readIf("RUNSCRIPT")) { c = parseRunScript(); } else if (readIf("RELEASE")) { c = parseReleaseSavepoint(); } break; case 's': case 'S': if (isToken("SELECT")) { c = parseSelect(); } else if (readIf("SET")) { c = parseSet(); } else if (readIf("SAVEPOINT")) { c = parseSavepoint(); } else if (readIf("SCRIPT")) { c = parseScript(); } else if (readIf("SHUTDOWN")) { c = parseShutdown(); } else if (readIf("SHOW")) { c = parseShow(); } break; case 't': case 'T': if (readIf("TRUNCATE")) { c = parseTruncate(); } break; case 'u': case 'U': if (readIf("UPDATE")) { c = parseUpdate(); } break; case 'v': case 'V': if (readIf("VALUES")) { c = parseValues(); } break; case 'w': case 'W': if (readIf("WITH")) { c = parserWith(); } break; default: throw getSyntaxError(); } if (indexedParameterList != null) { for (int i = 0, size = indexedParameterList.size(); i < size; i++) { if (indexedParameterList.get(i) == null) { indexedParameterList.set(i, new Parameter(i)); } } parameters = indexedParameterList; } if (readIf("{")) { do { int index = (int) readLong() - 1; if (index < 0 || index >= parameters.size()) { throw getSyntaxError(); } Parameter p = parameters.get(index); if (p == null) { throw getSyntaxError(); } read(":"); Expression expr = readExpression(); expr = expr.optimize(session); p.setValue(expr.getValue(session)); } while (readIf(",")); read("}"); for (Parameter p : parameters) { p.checkSet(); } parameters.clear(); } } if (c == null) { throw getSyntaxError(); } setSQL(c, null, start); return c; }